package com.ilxqx.framework.system.service;

import org.springframework.data.domain.Sort;

import java.util.List;
import java.util.Optional;

/**
 * 增删改查服务接口
 * @author venus
 */
public interface CrudService <T, ID> {

    /**
     * 根据ID获取记录
     * @param id 记录ID
     * @return 实体对象
     */
    Optional<T> get(ID id);

    /**
     * 根据ID判断记录是否存在
     * @param id 记录ID
     * @return bool
     */
    boolean exists(ID id);

    /**
     * 获取所有记录
     * @return 实体对象List
     */
    List<T> getList();

    /**
     * 根据多个ID获取多条记录
     * @param idList 记录ID集合
     * @return 记录List
     */
    List<T> getList(Iterable<ID> idList);

    /**
     * 根据排序获取所有记录
     * @param sort 排序对象
     * @return 实体对象List
     */
    List<T> getList(Sort sort);

    /**
     * 根据操作用户ID获取所有相关记录
     * @param operationUserId 操作用户ID
     * @return 实体对象List
     */
    List<T> getList(ID operationUserId);

    /**
     * 根据操作用户ID和排序对象获取所有相关记录
     * @param operationUserId 操作用户ID
     * @param sort 排序对象
     * @return 实体对象List
     */
    List<T> getList(Sort sort, ID operationUserId);

    /**
     * 获取表中记录总数
     * @return 记录数
     */
    long count();

    /**
     * 创建空的或者带有默认值的实体对象
     * @return 实体对象
     */
    T create();

    /**
     * 添加记录
     * @param entity 实体对象
     * @return 添加后的实体对象
     */
    T add(T entity);

    /**
     * 添加多条记录
     * @param entities 实体对象集合
     * @return 添加后的实体对象集合
     */
    Iterable<T> addAll(Iterable<T> entities);

    /**
     * 更新记录
     * @param entity 实体对象
     * @return 更新后的实体对象
     */
    T modify(T entity);

    /**
     * 更新多条记录
     * @param entities 实体对象集合
     * @return 更新后的实体对象集合
     */
    Iterable<T> modifyAll(Iterable<T> entities);

    /**
     * 根据记录ID删除记录
     * @param id 记录ID
     */
    void deleteById(ID id);

    /**
     * 根据实体对象删除记录
     * @param entity 实体对象
     */
    void delete(T entity);

    /**
     * 删除所有指定实体对象的记录
     * @param entities 实体对象集合
     */
    void deleteAll(Iterable<T> entities);

}
